package com.itjob.scott.lesson03;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Types;

public class ProcUtil {
	
	/**
	 * 加入注释10086
	 * 调用存储过程
	 * @param a  
	 * @param b
	 * @param s
	 * @throws ClassNotFoundException
	 */
	public static void callProc(String a,int b,String s) throws ClassNotFoundException{
		//1 加载数据库驱动
		Class.forName("oracle.jdbc.driver.OracleDriver");
		
		//xe表示数据库的名字 后面是用户名和密码 XE数据库只能有1个数据库就叫xe 而且不能修改名字
		Connection connection=null;
		CallableStatement cs=null;
		try {
			//2获取数据库连接
			connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","scott","scott");
			
			//3创建PreparedStatement 把参数预处理     把参数和sql整合成最终的语句
			cs = connection.prepareCall("{call bbb(?,?,?,?)}");
			
			//4给问号设值
			
			//设置入参
			cs.setString(1, a);
			cs.setInt(2, b);
			cs.setString(3, s);
			
			//设置出参的返回值类型
			cs.registerOutParameter(3, Types.VARCHAR); //设置s的值
			cs.registerOutParameter(4, Types.VARCHAR); //设置c的值
			
			
			//5执行SQL语句 CRUD 查询语句用executeQuery(),非查询语句用executeUpdate() 预处理
			cs.executeUpdate();
			
			System.out.println("s=" + cs.getString(3) + " \t c="+cs.getString(4));
			System.out.println("存储过程调用成功...");
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			//7 关闭资源  数据库的超时时间为30分钟  取到东西后要释放资源  先开后关  后开的先关
			try {
				if(cs!=null){
					cs.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				if(connection != null){
					connection.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

}
